package lockDemo.synchronizeDemo;

/**
 * @author Ajie
 * @date 2023/8/7
 * @function 在上述示例中，生产者线程调用 produce 方法来生产物品，而消费者线程调用 consume 方法来消费物品。
 * <p>
 * 当队列满时，生产者线程会被阻塞，直到消费者线程消费了一些物品。
 * 相反，当队列为空时，消费者线程会被阻塞，直到生产者线程生产了一些物品。
 * <p>
 * 总结：条件变量（如 wait() 和 notify()）允许线程等待某个条件成立，同时释放已经获得的锁，从而使其他线程可以进入同步代码块或方法并更改共享资源的状态。这是一种强大的同步机制，用于协调多个线程之间的工作。
 */
public class Sync_Wait_Notify_Queue_Test {
    public static void main(String[] args) {
        Sync_Wait_Notify_Queue queue = new Sync_Wait_Notify_Queue();

        //消费者线程的消费速度稍慢于生产者线程的生产速度。模拟速度差异。


        // 生产者线程
        // 生产者线程生产20个物品，每生产一个物品后休眠100毫秒；
        Thread producer = new Thread(() -> {
            for (int i = 0; i < 20; i++) {
                queue.produce("Item " + i);
                System.out.println("Produced: Item " + i);
                try {
                    Thread.sleep(10); // 模拟生产时间
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        });

        // 消费者线程
        // 每消费一个物品后休眠150毫秒。
        Thread consumer = new Thread(() -> {
            for (int i = 0; i < 20; i++) {
                Object item = queue.consume();
                System.out.println("Consumed: " + item);
                try {
                    Thread.sleep(150); // 模拟消费时间
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        });

        producer.start();
        consumer.start();

        try {
            producer.join();
            consumer.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
